#pragma once

#include "Mesh.h"

/**
 * @file Lighting.h
 * @author xingyifan
 * @date 2023-01-01 15:47
 *
 * @description: 光照条件类型
 */

// 光照条件
class Lighting
{
public:
    float L[3][3];       // 光照强度矩阵 a d s
    CG::coord4f l;       // 光源位置信息
    CG::vector3f center; // 投射光源的中心轴
    float a, b, c;       // 控制距离衰减因子
    float theta;         // 圆锥角
    float al;            // 投射光源的衰减指数

public:
    // 设置光照强度矩阵
    void SetLighting(float L[][3])
    {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                this->L[i][j] = L[i][j];
    }

    // 设置点光源
    void SetPoint(float x, float y, float z)
    {
        l = {x, y, z, 1};

        // 默认中心轴和不衰减
        center = {1, 0, 0};
        theta = 3.1415926;
        al = 0;
    }

    // 设置平行光源
    void SetParallel(float x, float y, float z)
    {
        l = {x, y, z, 0};
    }

    // 设置投射光源：先设置点光源，然后设置中心轴、圆锥角（度数）和衰减指数
    void SetCenter(float x, float y, float z, float theta, float a)
    {
        center = CG::normalize({x, y, z});
        this->theta = theta / 180 * 3.1415926;
        this->al = al;
    }

    // 设置距离衰减因子
    void SetReduce(float a, float b, float c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
    }
};